package cn.mandifal.advertising.service.impl;

import cn.mandifal.advertising.service.AdvertisingService;
import cn.mandifal.mapper.DpContentMapper;
import cn.mandifal.pojo.DpContent;
import cn.mandifal.pojo.DpContentExample;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import entity.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Date;
import java.util.List;

/**
 * 广告管理服务实现层
 * @author shun
 */
@Service
public class AdvertisingServiceImpl implements AdvertisingService {
    /**
     * 引入广告映射接口
     */
    @Autowired
    private DpContentMapper dpContentMapper;

    /**
     * 注入 redis 操作模板
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 查询全部广告
     * @return 返回列表
     */
    @Override
    public List<DpContent> findAll() {
        return dpContentMapper.selectByExample(null);
    }

    /**
     * 条件查询
     * @param dpContent 广告实体
     * @param pageNum 当前页 码
     * @param pageSize 每页记录数
     * @return 返回分页结果
     */
    @Override
    public PageResult search(DpContent dpContent, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        Page<DpContent> page= (Page<DpContent>) dpContentMapper.selectByExample(null);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加广告
     * @param dpContent 广告实体
     */
    @Override
    public void add(DpContent dpContent) {
        dpContent.setCreateTime(new Date());
        dpContentMapper.insert(dpContent);
        //清除此广告分类下的缓存，以便更新数据
        redisTemplate.boundHashOps("content").delete(dpContent.getCategoryId());
    }

    /**
     * 更新广告信息
     * @param dpContent 广告实体
     */
    @Override
    public void update(DpContent dpContent) {
        //得到此广告原来的分类 id
        Long categoryId = dpContentMapper.selectByPrimaryKey(dpContent.getId()).getCategoryId();
        //删除缓存中原分类下广告数据以便刷新数据
        redisTemplate.boundHashOps("content").delete(categoryId);
        //设置更新时间
        dpContent.setUpdateTime(new Date());
        dpContentMapper.updateByPrimaryKey(dpContent);
        //判断广告分类是否更改，如果更改则清除更改后分类下的缓存
        //此时的数据类型都是引用类型，所以转换成数值类型进行比较,考虑到空值情况所以没用 equals
        if (categoryId.longValue()!= dpContent.getCategoryId().longValue()){
            redisTemplate.boundHashOps("content").delete(dpContent.getCategoryId());
        }
    }

    /**
     * 查询广告详情
     * @param id 广告 id
     * @return 返回广告实体
     */
    @Override
    public DpContent findOne(Long id) {
        return dpContentMapper.selectByPrimaryKey(id);
    }

    /**
     * 批量删除
     * @param ids 广告 id 列表
     */
    @Override
    public void delete(Long[] ids) {
        for (Long id:ids){
            //得到此广告的分类 id，删除缓存
            DpContent dpContent = dpContentMapper.selectByPrimaryKey(id);
            redisTemplate.boundHashOps("content").delete(dpContent.getCategoryId());
            dpContentMapper.deleteByPrimaryKey(id);
        }
    }

    /**
     * 通过广告分类 id 查询广告
     * @param categoryId 广告分类 id
     * @return 返回广告列表
     */
    @Override
    public List<DpContent> findByCategoryId(Long categoryId) {
        //先从缓存中查，没有就放入
        List<DpContent> list = (List<DpContent>) redisTemplate.boundHashOps("content").get(categoryId);
        if (list==null){
            DpContentExample dpContentExample=new DpContentExample();
            DpContentExample.Criteria criteria = dpContentExample.createCriteria();
            criteria.andCategoryIdEqualTo(categoryId);
            //设置只查询有效的广告
            criteria.andStatusEqualTo("1");
            //按照排序显示,相当于在语句后加了 order by 语句
            dpContentExample.setOrderByClause("sort_order");
            list=dpContentMapper.selectByExample(dpContentExample);
            //放入 redis 数据库
            redisTemplate.boundHashOps("content").put(categoryId,list);
        }
        return list;
    }

}
